# -*- coding: utf-8 -*-
import psutil
import time
import datetime
from pprint import pprint #格式化打印（美化输出）

#定义一个专门用于获取系统信息的类

class Monitor(object):
    #单位转换的方法
    def bytes_to_gb(self,data,key =""):
        if key == "percent":
            return data
        else:
            return round(data/(1024**3),2)
    #专门获取CPU信息
    def cpu(self):
        #percent:True 获取每个cpu的使用率，False获取每个使用率
        # 1.平均 2.单独 3.物理cpu核心数 4.逻辑cpu核心数
        data = dict(
            percent_avg=psutil.cpu_percent(interval=0,percpu=False),
            percent_per = psutil.cpu_percent(interval=0, percpu=True),
            num_p = psutil.cpu_count(logical=False),
            num_l = psutil.cpu_count(logical=True)
        )
        return data
    # 专门获取内存信息
    def mem(self):
        #内存信息
        info = psutil.virtual_memory()
        data = dict(
            total = self.bytes_to_gb(info.total),
            used = self.bytes_to_gb(info.used),
            free = self.bytes_to_gb(info.free),
            percent = info.percent
        )
        return data
    #获取交换分区信息
    def swap(self):
        info = psutil.swap_memory()
        data = dict(
            total=self.bytes_to_gb(info.total),
            used=self.bytes_to_gb(info.used),
            free=self.bytes_to_gb(info.free),
            percent=info.percent
        )
        return data
    # 获磁盘信息
    def disk(self):
        #专门获取磁盘分区信息
        info = psutil.disk_partitions()
        #列表推导式
        data = [
            dict(
                device=v.device,
                mountpoint=v.mountpoint,
                fstype=v.fstype,
                opts=v.opts,
                used={
                    k:self.bytes_to_gb(v,k)
                    for k,v in psutil.disk_usage(v.mountpoint)._asdict().items()
                }
            )
          for v in info

        ]
        return  data
    #获磁盘读写能力


    #获取网络的信息
    def net(self):
        #获取地址信息
        addrs=psutil.net_if_addrs()

        #val.family.name取出协议地址族名称，AF_INET
        addrs_info={
            k:[
                dict(
                    family = val.family.name,
                    address =val.address,
                    netmask=val.netmask,
                    broadcast=val.broadcast

                )
                for val in v if val.family.name == "AF_INET"
            ][0]
            for k,v in addrs.items()
        }
        #获取输入输出信息（收发包数，输出包数）
        io=psutil.net_io_counters(pernic=True)
        data = [
            dict(
                name =k,
                bytes_sent=v.bytes_sent,
                bytes_recv=v.bytes_recv,
                packets_sent=v.packets_sent,
                packets_recv=v.packets_recv,
                **addrs_info[k]
            )
            for k, v in io.items()
        ]
        return data
    #时间戳转换为时间字符串的方法
    def td(self,tm):
        dt = datetime.datetime.fromtimestamp(tm)
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    #获取日期时间
    def dt(self):
        return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    #获取最近开机时间信息
    def lastest_start_time(self):
        #时间戳
        return self.td(psutil.boot_time())
    #获取系统登录的用户
    def logined_users(self):
        users=psutil.users()
        data =[
            dict(
                name=v.name,
                terminal=v.terminal,
                host=v.host,
                started=self.td(v.started),
                pid=v.pid
            )
            for v in users
        ]
        return data


if  __name__ == "__main__":
    m = Monitor()
    pprint(m.disk())
    # for i in range(1,11):
    #     print(m.cpu())
    #     time.sleep(1) #每个一秒打印一次